import EventUtils, { EventType } from "../public/EventUtils"

/**
 * websocket协议号
 */
export enum WsCode {
    /** 用户注册请求 */
    USER_REGISTER_REQ = 1001,
    /** 用户注册回调 */
    USER_REGISTER_RESP = 1002,
    /** 用户登录请求 */
    USER_LOGIN_REQ = 1003,
    /** 用户登录回调 */
    USER_LOGIN_RESP = 1004,

    /** 创建角色请求 */
    CREATE_ROLE_REQ = 1005,
    /** 创建角色回调 */
    CREATE_ROLE_RESP = 1006,

    /** 异常通知 */
    EXCEPTION_NOTICE = 99999,
}

/**
 * websocket管理类
 */
export default class WsUtils {
    /** websocket实例 */
    private static _ws: WebSocket = null

    /** 初始化websocket实例 */
    static initWs() {
        this._ws = new WebSocket("ws://127.0.0.1:8000/")

        this._ws.onopen = event => {
            cc.log("websocket 连接成功")
            EventUtils.emit(EventType.INIT_NET)
        }

        this._ws.onmessage = event => {
            let json = JSON.parse(event.data)
            cc.log("收到服务器回调：", json)

            if (json.code != WsCode.EXCEPTION_NOTICE) {
                // 派发消息
                EventUtils.emit(json.code, json.data)
            }
            else {
                cc.warn(json.data)
            }
        }

        this._ws.onerror = event => {
            cc.log("Send Text fired an error")
        }

        this._ws.onclose = event => {
            cc.log("WebSocket instance closed.")
        }
    }

    /**
     * 请求服务器
     * @param code 协议号
     * @param data 数据
     */
    static send(code: WsCode, data?) {
        let json = JSON.stringify({
            code: code,
            data: data,
        })
        this._ws.send(json)
    }
}
